package cn.byzk.xframe.web.common.constant.enums;

import cn.byzk.xframe.web.common.exception.BaseException;
import cn.byzk.xframe.web.common.exception.assertion.CommonExceptionAssert;
import cn.byzk.xframe.web.common.pojo.response.BaseResponse;
import lombok.AllArgsConstructor;
import lombok.Getter;

import javax.servlet.http.HttpServletResponse;


/**
 * 11*** 参数检验
 * 13,14,15 HTTP响应码对应错误
 * 16** 身份认证错误（session）
 * 2**** service层错误
 * 3**** CA&密码机&证书相关错误
 * 4****
 * @author xcf
 * @date 2021/5/5 23:51
 * @return null
 */
@Getter
@AllArgsConstructor
public enum CommonResponseEnum implements CommonExceptionAssert {
    /**
     * 成功
     */
    SUCCESS(0, "SUCCESS"),

    SYS_IN_ERROR(1001, "系统内部错误"),
    AUTH_ERROR(1600, "身份认证失败"),
    IS_NOT_LOGIN(401, "用户未登陆"),
    ACCESS_DENIED(403, "拒绝访问"),


    ARRAY_INDEX_OUT_ERROR(9996, "数组越界"),
    NULL_POINT_ERROR(9997, "空指针异常"),
    /**
     * 服务器繁忙，请稍后重试
     */
    SERVER_BUSY(9998, "服务器繁忙"),
    /**
     * 服务器异常，无法识别的异常，尽可能对通过判断减少未定义异常抛出
     */
    SERVER_ERROR(9999, "服务异常"),


    /**
     * 5***，一般对应于{@link com.sprainkle.spring.cloud.advance.common.core.exception.ArgumentException}，系统封装的工具出现异常
     */

    // Time
    DATE_NOT_NULL(5001, "日期不能为空"),
    DATETIME_NOT_NULL(5001, "时间不能为空"),
    TIME_NOT_NULL(5001, "时间不能为空"),
    DATE_PATTERN_MISMATCH(5002, "日期[%s]与格式[%s]不匹配，无法解析"),
    PATTERN_NOT_NULL(5003, "日期格式不能为空"),
    PATTERN_INVALID(5003, "日期格式[%s]无法识别"),
    ;

    /**
     * 返回码
     */
    private int code;
    /**
     * 返回消息
     */
    private String message;

    /**
     * 校验返回结果是否成功
     * @param response 远程调用的响应
     */
    public static void assertSuccess(BaseResponse response) {
        SERVER_ERROR.assertNotNull(response);
        int code = response.getCode();
        if (CommonResponseEnum.SUCCESS.getCode() != code) {
            String msg = response.getMessage();
            throw new BaseException(code, msg);
        }
    }
}
